﻿#region Librerias usadas FormLogin
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Librerias;
#endregion

namespace eCampus
{
    public partial class FormLogin : Form
    {
        #region Constructores FormLogin
        /// <summary>
        /// Constructor por defecto de Formulario FormLogin 
        /// </summary>
        public FormLogin()
        {
            InitializeComponent();
        }
        #endregion

        #region interfaz pública
        /// <summary>
        /// Si el usuario2 no puede acceder pedirá ayuda al administrador
        /// </summary>
        /// <param name="sender">LinkLabel</param>
        /// <param name="entidadUsuario">Evento Click</param>
        private void linklbNoPuedoAcceder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            tbUsuario.Text = "";
            tbContrasenya.Text = "";
            FormNoPuedoAccesoAlSistema FormSocorro1 = new FormNoPuedoAccesoAlSistema();
            FormSocorro1.ShowDialog();
            FormSocorro1.Dispose();
        }
        #endregion

        #region Control de errores en la entrada de la información FormLogin
        /// <summary>
        /// Comprueba que tbUsuario y tcContrasenya no sean vacíos
        /// </summary>
        /// <returns>Si están bien o no</returns>
        private bool comprobarCampos()
        {
            EP.SetError(tbUsuario, "");
            EP.SetError(tbContrasenya, "");
            bool ret = true;
            if (tbUsuario.Text == "")
            {
                EP.SetError(tbUsuario, "Usuario no puede ser vacío");
                ret = false;
            }
            if (tbContrasenya.Text == "")
            {
                EP.SetError(tbContrasenya, "Contraseña no puede ser vacía");
                ret = false;
            }     

            return ret;
        }
        #endregion
   
        #region Interfaz privada FormLogin
        /// <summary>
        /// Intento de Inicio de sesión si apretamos al botón "Iniciar sesión"
        /// </summary>
        /// <param name="sender">el borón</param>
        /// <param name="entidadUsuario">Click</param>
        private void btAceptar_Click(object sender, EventArgs e)
        {
            comprobarCampos();
            IniciarSesion();
        }

        /// <summary>
        /// Comprobará la correcta autenticación del usuario2 que intenta acceder.
        /// Sólo será permitido con los usuarios de tipo: profesor-administrador
        /// Según el tipo de usuario2:
        /// - levantará un formulario u otro: adecuado con su perfil
        /// </summary>
        private void IniciarSesion()
        {
            ENUsuario criado = new ENUsuario();  //para llamar a funciones del CAD
            DataTable tablaConUsuario = null;    //para traerme el usuario2 implicado y poder pasárselo al Formulario pertinente
            int tipoUsuarioQueEntra = -1;        //para entrar a un formulario u otro según del usuario2 que se autentique  
 
            //Limpio formulario
            EP.Clear();

            //-----------------me entero de qué tipo de usuario2 quiere acceder------------------
            try
            {
                //¿ Es Administrador?
                if (criado.EsClaveValidaAdministrador(tbUsuario.Text, tbContrasenya.Text) == true)
                {
                    tipoUsuarioQueEntra = 0;
                }
                else
                {
                    //¿ Es Profesor?
                    if (criado.EsClaveValidaProfesor(tbUsuario.Text, tbContrasenya.Text) == true)
                    {
                        tipoUsuarioQueEntra = 1;
                    }
                    else
                    {
                        //¿ Es Alumno?
                        if (criado.EsClaveValidaAlumno(tbUsuario.Text, tbContrasenya.Text) == true)
                        {
                            tipoUsuarioQueEntra = 2;
                        }
                        else
                        {
                            //¿ Es un Intruso?
                            tipoUsuarioQueEntra = -1;
                        }
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("No ha sido posible el inicio de sesión", "Error");
            }
            //----------------Monto el formulario según el usuario2 que quiere acceder------------
            switch(tipoUsuarioQueEntra)
            {
                case 0:
                       tablaConUsuario = criado.dimeUsuarioSegunCorreo(tbUsuario.Text);
                       ENUsuario usuarioAbreFormularioAdmin = new ENUsuario(tablaConUsuario.Rows[0][0].ToString(), tablaConUsuario.Rows[0][1].ToString(), tablaConUsuario.Rows[0][3].ToString(), tablaConUsuario.Rows[0][4].ToString(), tablaConUsuario.Rows[0][5].ToString(), tablaConUsuario.Rows[0][2].ToString(), tablaConUsuario.Rows[0][6].ToString(), int.Parse(tablaConUsuario.Rows[0][8].ToString()), tablaConUsuario.Rows[0][7].ToString(), tablaConUsuario.Rows[0][9].ToString());
                       FormPadreAdministrador formularioAdmin = new FormPadreAdministrador(usuarioAbreFormularioAdmin);
                       tbUsuario.Text = "";
                       tbContrasenya.Text = "";
                       Visible = false;
                       formularioAdmin.ShowDialog();
                       formularioAdmin.Dispose();
                       break;
                case 1:
                       tablaConUsuario = criado.dimeUsuarioSegunCorreo(tbUsuario.Text);
                       ENUsuario usuarioAbreFormularioProf = new ENUsuario(tablaConUsuario.Rows[0][0].ToString(), tablaConUsuario.Rows[0][1].ToString(), tablaConUsuario.Rows[0][3].ToString(), tablaConUsuario.Rows[0][4].ToString(), tablaConUsuario.Rows[0][5].ToString(), tablaConUsuario.Rows[0][2].ToString(), tablaConUsuario.Rows[0][6].ToString(), int.Parse(tablaConUsuario.Rows[0][8].ToString()), tablaConUsuario.Rows[0][7].ToString(), tablaConUsuario.Rows[0][9].ToString()); 
                     
                       FormPadreProfesor formularioProfe = new FormPadreProfesor(usuarioAbreFormularioProf);
                       tbUsuario.Text = "";
                       tbContrasenya.Text = "";
                       Visible = false;
                       formularioProfe.ShowDialog();
                       formularioProfe.Dispose(); 
                       break; 
                case 2:
                       ENMensaje mensajeChivato = new ENMensaje("sistema@ecampus.es", "admin@ua.es", "Intento de Acceso indebido a eCampus", "El usuario:              " + tbUsuario.Text + "     no autorizado ha intentado acceder en el Interfaz de administración." + "\r\nDesde la máquina:  " + Environment.MachineName + "\r\nBajo sesión de:       " + Environment.UserName + "\r\nEl:                           " + DateTime.Now + "\r\n\r\nServicio de Informática eCampus.", "");
                       mensajeChivato.Enviar();
                       tbUsuario.Text = "";
                       tbContrasenya.Text = "";
                       MessageBox.Show("Un alumno no puede acceder a la Interfaz de Administración de eCampus.\n\nEl Depto de Informática ha sido informada de este intento de acceso indebido", "Advertencia de acceso indebido", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                       tbUsuario.Focus();
                       break;  
                case -1:
                       tbContrasenya.Text = "";
                       EP.SetError(tbUsuario, "Debe introducir un Usuario y una Contraseña válidos");
                       tbUsuario.Focus();
                       break;  
            }
        }
        #endregion

        #region Usabilidad FormLogin
        /// <summary>
        /// Al entrar a tbUsuario se pone de color
        /// </summary>
        /// <param name="sender">tbUsuario</param>
        /// <param name="entidadUsuario">Evento Enter</param>
        private void tbUsuario_Enter(object sender, EventArgs e)
        {
            tbUsuario.BackColor = Color.LightYellow;
        }

        /// <summary>
        /// Al salir de tbUsuario se quita el color
        /// </summary>
        /// <param name="sender">tbUsuario</param>
        /// <param name="entidadUsuario">Evento Leave</param>
        private void tbUsuario_Leave(object sender, EventArgs e)
        {
            tbUsuario.BackColor = Color.White;
        }

        /// <summary>
        /// Al entrar a tbContrasenya se pone de color
        /// </summary>
        /// <param name="sender">tbConstrasenya</param>
        /// <param name="entidadUsuario">Evento Enter</param>
        private void tbContrasenya_Enter(object sender, EventArgs e)
        {
            tbContrasenya.BackColor = Color.LightYellow;
        }

        /// <summary>
        /// Al salir de tbContrasenya se quita el color
        /// </summary>
        /// <param name="sender">tbConstrasenya</param>
        /// <param name="entidadUsuario">Evento Leave</param>       
        private void tbContrasenya_Leave(object sender, EventArgs e)
        {
            tbContrasenya.BackColor = Color.White;
        }

        /// <summary>
        /// Si le damos a Enter estando en tbUsuario salta de campo
        /// </summary>
        /// <param name="sender">tbUsuario</param>
        /// <param name="entidadUsuario">Evento KeyPress</param>
        private void tbUsuario_KeyPress(object sender, KeyPressEventArgs e)
        {
             if (e.KeyChar == (char)(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        /// <summary>
        /// Si le damos a Enter estando en tbContrasenya salta de campo
        /// </summary>
        /// <param name="sender">tbContrasenya</param>
        /// <param name="entidadUsuario">Evento KeyPress</param>
        private void tbContrasenya_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        /// <summary>
        /// Cuándo pinte el formulario que le dé foco a tbUsuario
        /// </summary>
        /// <param name="sender">Formulario</param>
        /// <param name="entidadUsuario">Evento Shown</param>
        private void FormLogin_Shown(object sender, EventArgs e)
        {
            tbUsuario.Focus();
        }
        #endregion

    }
}